// 按需导入接口函数
import {
  loginAPI,
  getUserProfileAPI,
  getUserInfoAPI
} from '@/api/user'
import { setToken, getToken } from '@/utils/auth'

// 从路由模块中导入重置路由方法
import { resetRouter } from '@/router'

/* 用户状态模块 */
const state = () => {
  return {
    // token，通过 getToken() 从本地取，有值就用；否则就用空字符串
    token: getToken() || '',
    // 用户资料
    profile: {}
  }
}
const mutations = {
  setToken: (state, token) => {
    // 存到 vuex
    state.token = token
    // 存本地
    setToken(token)
  },
  setProfile: (state, profile) => {
    state.profile = profile
  }
}

const actions = {
  // 登录
  loginAction: async ({ commit }, loginForm) => {
    // 调用登录接口
    const resp = await loginAPI(loginForm)
    // 对token的赋值
    commit('setToken', resp.data)
  },
  // 获取用户资料
  getProfileAction: async ({ commit }) => {
    // 调用获取用户基本资料的接口
    const { data: profile } = await getUserProfileAPI()
    // 基于userId -> 获取用户个人信息
    const { data: userInfo } = await getUserInfoAPI(profile.userId)
    // 两次信息合并之后
    const userObj = {
      ...profile,
      ...userInfo
    }
    // 提交到 setProfile
    commit('setProfile', userObj)
    // 返回用户信息 -> 返回给这个action函数调用的地方
    return userObj
  },
  // 退出
  logoutAction: ({ commit }) => {
    // 提交两次mutation，清空token和profile
    commit('setToken', '')
    commit('setProfile', {})
    // 重置路由表
    resetRouter()
    // 清空vuex中rotues
    // 这里需要从全局下访问另一个子模块的mutation函数，
    // 需要传入第3个参数：{ root: true }，表明从全局下出发去查找
    commit('permission/setRoutes', [], { root: true })

    // 重置主题色
    commit('settings/resetTheme', null, { root: true })
  }
}
// 导出用户模块对象
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
